package com.his.emr.print.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.his.emr.print.utils.MyDriver;

/**
 * Add 2018年2月10日<br>
 * Tomcat关闭了,"phantomjs.exe"进程仍然存在!<br>
 * 
 * 百度搜索"在tomcat关闭时执行方法"<br>
 * 参考: [web容器关闭时执行方法](https://www.jianshu.com/p/cb3b91f233df)<br>
 * 需要在"web.xml"中配置这个listener.<br>
 * 
 * update: 2018年2月15日<br>
 * 我现在有点怀疑人生了,今天关闭tomcat容器时发现进程仍然存在,那说明这方法还是不行啊!<br>
 * 还是得手动清理"phantomjs.exe"进程(应该继续研究cssbox,以便拜托对"phantomjs.exe"的依赖)<br>
 * 
 * @author Wxg
 *
 */
public class TomcatListener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("..contextInitialized....");
		MyDriver.getStaticDriver();
		
		/**
		 * API: http://tool.oschina.net/uploads/apidocs/jdk-zh/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
		 * 按照API上的说法,在某些特殊情况下,虚拟机会中止.而不能正常调用关闭钩子.
		 * 所以下面的方法也不一定保险!这时就要人工干预了!
		 * 在2018年2月10日,在eclipse下测试成功,下面的关闭钩子正常执行关闭了"phantomjs.exe"进程!
		 */
		Runtime.getRuntime().addShutdownHook(new Thread(){
			@Override
			public void run() {
				MyDriver.closeStaticDriver();
			}
		});
	}

	/**
	 * 没有效果啊;我在eclipse中启动tomcat,在eclipse中关闭tomcat,
	 * 但是并没有调用`contextDestroyed`, "phantomjs.exe"进程依然存在.
	 * 
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("..contextDestroyed....");
		MyDriver.closeStaticDriver();
	}

}
